/**
<p>给你一个链表数组，每个链表都已经按升序排列。</p>

<p>请你将所有链表合并到一个升序链表中，返回合并后的链表。</p>

<p>&nbsp;</p>

<p><strong>示例 1：</strong></p>

<pre><strong>输入：</strong>lists = [[1,4,5],[1,3,4],[2,6]]
<strong>输出：</strong>[1,1,2,3,4,4,5,6]
<strong>解释：</strong>链表数组如下：
[
  1-&gt;4-&gt;5,
  1-&gt;3-&gt;4,
  2-&gt;6
]
将它们合并到一个有序链表中得到。
1-&gt;1-&gt;2-&gt;3-&gt;4-&gt;4-&gt;5-&gt;6
</pre>

<p><strong>示例 2：</strong></p>

<pre><strong>输入：</strong>lists = []
<strong>输出：</strong>[]
</pre>

<p><strong>示例 3：</strong></p>

<pre><strong>输入：</strong>lists = [[]]
<strong>输出：</strong>[]
</pre>

<p>&nbsp;</p>

<p><strong>提示：</strong></p>

<ul> 
 <li><code>k == lists.length</code></li> 
 <li><code>0 &lt;= k &lt;= 10^4</code></li> 
 <li><code>0 &lt;= lists[i].length &lt;= 500</code></li> 
 <li><code>-10^4 &lt;= lists[i][j] &lt;= 10^4</code></li> 
 <li><code>lists[i]</code> 按 <strong>升序</strong> 排列</li> 
 <li><code>lists[i].length</code> 的总和不超过 <code>10^4</code></li> 
</ul>

<div><div>Related Topics</div><div><li>链表</li><li>分治</li><li>堆（优先队列）</li><li>归并排序</li></div></div><br><div><li>👍 2403</li><li>👎 0</li></div>
*/

//leetcode submit region begin(Prohibit modification and deletion)

import leetcode.editor.cn.ListNode;

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode mergeKLists(ListNode[] lists) {
        if(lists.length == 0) return null;
        for(int i=0;i<lists.length-1;i++){
            mergeKLists(lists, i);
        }
        return lists[lists.length-1];
    }

    private void mergeKLists(ListNode[] lists, int n) {
        if(n>=lists.length-1) return;
        lists[n+1] = merge2Lists(lists[n], lists[n+1]);
    }

    private ListNode merge2Lists(ListNode head1, ListNode head2) {
        if(head1 == null) return head2;
        if(head2 == null) return head1;
        if(head1.val <= head2.val){
            head1.next = merge2Lists(head1.next, head2);
            return head1;
        }
        head2.next = merge2Lists(head1, head2.next);
        return head2;
    }

}
//leetcode submit region end(Prohibit modification and deletion)
